import jwt
from jwt import PyJWTError

from comment.utils import const
from flask import current_app
from comment.models.user import User
from datetime import datetime,timedelta
def generrate_tokens(uid):
    '''
    根据已经登录之后的用户id 生成token
    :param uid: 用户id
    :return:
    '''
    payload={
        'id':uid,
        #exp代表token 必须是标准时间值
        'exp':datetime.utcnow()+timedelta(seconds=const.JWT_EXPIRY_SECOND)
    }
    #参数1：是一个字典包括加密的用户id和有效时间  参数2秘钥  参数3 算法
    s = jwt.encode(payload=payload,key=const.SECRET_KEY,algorithm='HS256')
    #生成token
    return s


def verify_tokens(token_str):
    '''
    验证token  并且验证成功返回用户id
    :param token_str:
    :return:
    '''

    # token_str = token_str.encode('utf-8')
    # current_app.logger.info(token_str)
    try:
        # 本质上就是一个解密的过程
        data = jwt.decode(token_str,key=const.SECRET_KEY, algorithms='HS256')

    except PyJWTError as e:
        current_app.logger.info(e)
        return {'message':'token 验证失败'}
    #如果token验证成功 还需要看看当前用户状态是否正常
    user = User.query.filter(User.id == data['id']).first()
    if user and user.status !=0:
        return {'message':'数据库中的用户状态过期'}
    return {'id':user.id}